/**
 * @defgroup FileManager Java的常见文件操作的例子
 * @author 李焕帅
 * @version 0.1
 * @date 30/07/2012
 * @{
 */
package indd.lihs.basic.utils;

import java.io.*;

import indd.lihs.basic.exceptions.*;

/**
 * @name 基本文件管理类
 * @{
 */
public class FileManager
{
    /**
     * 主函数
     * @param[in] args 参数字符串数组
     * @return void
     * @note 某个方法可能抛出某种异常,但其中没有定义相应的捕获代码.这时如果抛出,\n
     * 则系统直接退出该方法,并将异常发回给调用者其中, 如果父类的方法没有声明某种必\n
     * 检异常,子类进行方法覆盖时,也不能声明
     */
    public static void main(String[] args)
    {
        try
        {
            if (args[0].equals("copy"))
           {
                if (args.length < 3) throw new LackNecessaryArgumentException();
                FileManager.CopyFile(args[1], args[2]);
           }
           else
               throw new UnkownOptionArgumentException();
        }
        catch (UnkownOptionArgumentException ex)
        {
            System.out.println(ex);
            ex.printStackTrace();
        }
        catch (LackNecessaryArgumentException ex)
        {
            System.out.println(ex);
            ex.printStackTrace();
        }
    }
    
    /**
     * 文件复制方法
     * @parm[in] pathFrom 旧文件路径
     * @parm[in] pathTo 新文件路径
     * @return boolean 复制是否成功
     */
    public static boolean CopyFile(String pathFrom, String pathTo)
    {
        boolean ret = false;
        FileInputStream fin = null;
        FileOutputStream fout = null;
        try
        {
            File fromFile = new File(pathFrom);
            if (!fromFile.isFile()) throw new FileNotExistedException();
            File toFile = new File(pathTo);
            if (toFile.isFile()) throw new FileExistedException();
            fin = new FileInputStream(fromFile);
            fout = new FileOutputStream(toFile);
            int avail = fin.available();
            int counter = 0;
            int ch;
            //逐字节复制
            while ((ch = fin.read()) != -1)
            {
                fout.write(ch);
                ++counter;
            }
            if (avail != counter)
            {
                System.out.println();
                throw new FileLengthNotKeepEqualExpection();
            }
            System.out.println("Copied 1 file, " + counter + "byte(s).");
            ret = true;
        }
        catch (FileExistedException ex)
        {
            System.out.println(ex);
            ex.printStackTrace();
        }
        catch (FileNotExistedException ex)
        {
            System.out.println(ex);
            ex.printStackTrace();
        }
        catch (FileLengthNotKeepEqualExpection ex)
        {
            System.out.println(ex);
            ex.printStackTrace();
        }
        catch (IOException ex)
        {
            System.out.println(ex);
            ex.printStackTrace();
        }
        finally
        {
            try
            { //文件流不为空时关闭
                if (null != fin) fin.close();
                if (null != fout) fout.close();
            }
            catch (IOException ex)
            {
                System.out.println(ex);
                ex.printStackTrace();
            }
        }
        return ret;
    }
}
